// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rainbowchat.im.impl;

import io.netty.channel.Channel;

import java.util.Set;
import java.util.concurrent.ConcurrentMap;

import net.x52im.mobileimsdk.server.processor.OnlineProcessor;

import com.eva.epc.common.util.CommonUtils;
import com.eva.framework.utils.LoggerFactory;
import com.x52im.rainbowchat.http.logic.LogicProcessor2;

/**
 * 用户在线状态逻辑管理器.
 * 
 * @author Jack Jiang(http://www.52im.net/space-uid-1.html)
 * @version 1.0
 */
public class UsersStatusManager
{
	public UsersStatusManager()
	{
		// 保证服务器重置时能无条件重置用户的“是否在线”状态
		resetUserOnlieStatusToDB();
	}
	
	/**
	 * 用户是否在线.
	 * 
	 * 
	 * @param uid 此参数为必须项
	 * @return
	 */
	public boolean isOnline(String uid)
	{
		return OnlineProcessor.isOnline(uid);
	}
	
	/**
	 * 用户上线.
	 * 
	 * @param uidOrMail
	 * @param user_id
	 */
	public void userOnline(String user_id)
	{
		// 将用户上线状态更新至用户数据库表中
		userOnlineToDB(user_id);
	}
	
	/**
	 * 用户下线.
	 * 
	 * @param uidOrMail
	 */
	public void userOffline(String uidOrMail)
	{
		// 将用户离线状态更新至数据库表中
		userOfflineToDB(uidOrMail);
	}
	
	public ConcurrentMap<String, Channel> getLiveUsers()
	{
		return OnlineProcessor.getInstance().getOnlineSessions();
	}
	
	public void printLiveUsers()
	{
		Set<String> keys = getLiveUsers().keySet();
		LoggerFactory.getLog().debug("[RBChat]<----------当前在线用户共("+keys.size()+")人--------->");
//		for(String key : keys)
//			LoggerFactory.getLog().debug("uidOrMail="+key+",user_id="+liveUsers.get(key));
	}

	//----------------------------------------------------------------------------------------
	/**
	 * 无条件重置用户列中的“是否在线”字段为“不在线”.
	 * 
	 * <p>
	 * 通常会在服务端重启时无条件重置一次，保证服务端因意外终止时未及时重置的用户在线状态能被正确重置.
	 */
	private boolean resetUserOnlieStatusToDB()
	{
		boolean sucess = false;
		try
		{
			LogicProcessor2.db.update("update missu_users set is_online=0", new Object[]{}, true);
			sucess = true;
		}
		catch (Exception e)
		{
			if(e instanceof IllegalArgumentException)
			{
				LoggerFactory.getLog().debug("[RBChat]resetUserOnlieStatusToDB()时，影响行数为0，" +
						"原因应是之前的用户在线状态已被全部正常复位，请忽略本条Log哦。(DEBUG INFO："+e.getMessage()+")");
			}
			else
			{
				LoggerFactory.getLog().warn("[RBChat]resetUserOnlieStatusToDB()用户在线状态时有问题哦，", e);
			}
		}
		return sucess;
	}
	
	/**
	 * 将用户上线状态更新至用户数据库表中.
	 * 
	 * @param uidOrMail
	 * @return
	 */
	private boolean userOnlineToDB(String uidOrMail)
	{
		return _userIsOnlineStatusUpdateToDB(true, uidOrMail);
	}
	/**
	 * 将用户离线状态更新至数据库表中.
	 * 
	 * @param uidOrMail
	 * @return
	 */
	private boolean userOfflineToDB(String uidOrMail)
	{
		return _userIsOnlineStatusUpdateToDB(false, uidOrMail);
	}
	private boolean _userIsOnlineStatusUpdateToDB(boolean online, String uidOrMail)
	{
		boolean sucess = false;
		try
		{
			LogicProcessor2.db.update(
					"update missu_users set is_online="+(online?1:0)
						+" where "+(CommonUtils.isEmail(uidOrMail)?"user_mail='"+uidOrMail+"'":"user_uid="+uidOrMail)
//						+" where (ltrim(str(user_uid))='"+uidOrMail+"' or user_mail='"+uidOrMail+"')"
					, new Object[]{}, true);
			sucess = true;
		}
		catch (Exception e)
		{
			if(e instanceof IllegalArgumentException)
			{
				LoggerFactory.getLog().debug("[RBChat]_userIsOnlineStatusUpdateToDB()时，影响行数为0，" +
						"原因应是用户"+uidOrMail+"的在线状态已被正常复位，请忽略本条Log哦。(DEBUG INFO："+e.getMessage()+")");
			}
			else
			{
				LoggerFactory.getLog().warn("[RBChat]_userIsOnlineStatusUpdateToDB()用户在线状态时有问题哦，", e);
			}
		}
		return sucess;
	}
}
